from rest_framework import serializers
from .models import Vehicle
from user_app.serializers import UserSerializer
import re


class CustomURLField(serializers.URLField):
    """自定义URL字段，支持更宽松的URL验证"""
    
    def to_internal_value(self, data):
        # 如果数据是文件对象，直接返回，不进行URL验证
        if hasattr(data, 'name') and hasattr(data, 'size'):
            return data
            
        # 先尝试使用标准URL验证
        try:
            return super().to_internal_value(data)
        except serializers.ValidationError:
            # 如果标准验证失败，使用自定义验证
            if self.is_custom_valid_url(data):
                return data
            raise serializers.ValidationError("请输入合法的URL。")
    
    def is_custom_valid_url(self, url):
        """自定义URL验证逻辑"""
        # 检查是否是有效的URL格式
        # 允许包含已编码的特殊字符
        url_pattern = re.compile(
            r'^https?://'  # http:// 或 https://
            r'(?:(?:[A-Z0-9](?:[A-Z0-9-]{0,61}[A-Z0-9])?\.)+[A-Z]{2,6}\.?|'  # 域名
            r'localhost|'  # localhost
            r'\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})'  # IP地址
            r'(?::\d+)?'  # 可选端口号
            r'(?:/?|[/?]\S+)$', re.IGNORECASE)
        return url_pattern.match(url) is not None


class VehicleLicenseImageField(serializers.Field):
    """
    车辆行驶证图片字段
    支持文件上传和URL输入，视图层会处理文件上传并转换为URL
    """
    
    def to_representation(self, value):
        return value
    
    def to_internal_value(self, data):
        # 接受任何数据类型，因为视图层会处理文件上传
        return data


class VehicleImageField(serializers.Field):
    """
    车辆图片字段
    支持文件上传和URL输入，视图层会处理文件上传并转换为URL
    """
    
    def to_representation(self, value):
        return value
    
    def to_internal_value(self, data):
        # 接受任何数据类型，因为视图层会处理文件上传
        return data


class VehicleSerializer(serializers.ModelSerializer):
    """车辆序列化器
    
    用于序列化车辆详细信息，包括：
    - 基本信息（车牌号、车辆类型、载重信息）
    - 尺寸信息（长、宽、高）
    - 位置信息（当前位置、经度、纬度、位置更新时间）
    - 状态信息（车辆状态、可用时间）
    - 证件信息（行驶证号、行驶证照片、车辆图片）
    - 审核状态（是否已审核通过）
    - 时间信息（创建时间、更新时间）
    """

    user = UserSerializer(read_only=True)
    status_display = serializers.CharField(source='get_status_display', read_only=True)
    vehicle_type_display = serializers.CharField(source='get_vehicle_type_display', read_only=True)

    class Meta:
        model = Vehicle
        fields = [
            'id', 'user', 'license_plate', 'vehicle_type', 'vehicle_type_display',
            'capacity', 'length', 'width', 'height',
            'current_location', 'longitude', 'latitude', 'location_updated_at',
            'status', 'status_display', 'available_time',
            'vehicle_license', 'vehicle_license_image',
            'vehicle_image', 'is_approved',
            'created_at', 'updated_at'
        ]
        read_only_fields = [
            'id', 'user', 'status_display', 'vehicle_type_display',
            'location_updated_at', 'created_at', 'updated_at', 'is_approved'
        ]


class VehicleCreateSerializer(serializers.ModelSerializer):
    """车辆创建序列化器"""
    
    # vehicle_license_image字段使用自定义字段以支持文件上传和URL
    vehicle_license_image = VehicleLicenseImageField(required=False)
    vehicle_image = VehicleImageField(required=False)
    
    class Meta:
        model = Vehicle
        fields = [
            'license_plate', 'vehicle_type',
            'capacity', 'length', 'width', 'height',
            'current_location', 'longitude', 'latitude',
            'status', 'available_time',
            'vehicle_license', 'vehicle_license_image',
            'vehicle_image'
        ]
    
    def create(self, validated_data):
        vehicle = Vehicle.objects.create(**validated_data)
        return vehicle


class VehicleUpdateSerializer(serializers.ModelSerializer):
    """车辆更新序列化器"""
    
    # vehicle_license_image字段使用自定义字段以支持文件上传和URL
    vehicle_license_image = VehicleLicenseImageField(required=False)
    vehicle_image = VehicleImageField(required=False)
    
    class Meta:
        model = Vehicle
        fields = [
            'license_plate', 'vehicle_type',
            'capacity', 'length', 'width', 'height',
            'current_location', 'longitude', 'latitude',
            'status', 'available_time',
            'vehicle_license', 'vehicle_license_image',
            'vehicle_image'
        ]


class VehicleLocationUpdateSerializer(serializers.ModelSerializer):
    """车辆位置更新序列化器
    
    用于更新车辆的位置信息，包括：
    - 当前位置描述 (current_location)
    - 经度 (longitude)
    - 纬度 (latitude)
    
    更新位置时，系统会自动更新位置更新时间 (location_updated_at) 字段。
    """

    class Meta:
        model = Vehicle
        fields = ['current_location', 'longitude', 'latitude']
    
    def update(self, instance, validated_data):
        instance.current_location = validated_data.get('current_location', instance.current_location)
        instance.longitude = validated_data.get('longitude', instance.longitude)
        instance.latitude = validated_data.get('latitude', instance.latitude)
        from django.utils import timezone
        instance.location_updated_at = timezone.now()
        instance.save()
        return instance


class VehicleListSerializer(serializers.ModelSerializer):
    """车辆列表序列化器"""
    
    user_name = serializers.CharField(source='user.phone', read_only=True)
    status_display = serializers.CharField(source='get_status_display', read_only=True)
    vehicle_type_display = serializers.CharField(source='get_vehicle_type_display', read_only=True)
    
    class Meta:
        model = Vehicle
        fields = [
            'id', 'user_name', 'license_plate',
            'vehicle_type', 'vehicle_type_display',
            'capacity', 'current_location',
            'status', 'status_display',
            'available_time', 'created_at', 'is_approved'
        ]
        read_only_fields = [
            'id', 'user_name', 'status_display',
            'vehicle_type_display', 'created_at', 'is_approved'
        ]